package com.maiko.usercenter.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.jackson.JsonComponent;
import org.springframework.context.annotation.Bean;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

/**
 *
 * Java 的 Long 是 64 位，而 JavaScript 的 Number 类型是 双精度 64 位浮点数（IEEE 754），其安全整数范围为：
 * -2^53 + 1 到 2^53 - 1（即：-9007199254740991 到 9007199254740991）
 * 当一个 Long 超过这个范围时，前端就会发生精度丢失。
 *
 * 举个例子：
 * 后端对象返回的 JSON：
 * {
 *   "id": 1234567890123456789,
 *   "name": "Maiko7"
 * }
 * 但是 JavaScript 解析时：
 * const user = {
 *   id: 1234567890123456789,
 *   name: "Maiko7"
 * };
 * console.log(user.id); // 输出：1234567890123456768 ❌（精度丢失）
 *
 *
 * 但是你配置了下面的JsonConfig 后
 * 后端返回的 JSON：
 * {
 *   "id": "1234567890123456789",
 *   "name": "Maiko7"
 * }
 * JavaScript 解析时：
 * const user = {
 *   id: "1234567890123456789",
 *   name: "Maiko7"
 * };
 * console.log(user.id); // 输出："1234567890123456789" ✅ 正确保留
 *
 * 这个配置是后端为前端保驾护航的典型例子，尤其是涉及 ID、订单号、雪花算法生成的 long 类型主键等，强烈建议添加。
 *
 * @author: Maiko7
 * @create: 2025-07-16 7:09
 */
@JsonComponent
public class JsonConfig {

    /**
     * 添加 Long 转 json 精度丢失的配置
     */
    @Bean
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        SimpleModule module = new SimpleModule();
        module.addSerializer(Long.class, ToStringSerializer.instance);
        module.addSerializer(Long.TYPE, ToStringSerializer.instance);
        objectMapper.registerModule(module);
        return objectMapper;
    }
}
